From f2f33db0f49599547622230bbcea89779af8ec15 Mon Sep 17 00:00:00 2001 From: "iap10@freefall.cl.cam.ac.uk" Date: Wed, 7 Sep 2005 23:10:49 +0000 Subject: [PATCH] Replace direct_remap_area_pages with direct_remap_pfn_range to help fix PAE domain building. Signed-off-by: ian@xensource.com --- .../arch/xen/i386/mm/ioremap.c | 19 +++++++++++-------- .../drivers/xen/netback/interface.c | 8 ++++---- .../drivers/xen/privcmd/privcmd.c | 4 ++-- .../drivers/xen/usbback/interface.c | 4 ++-- .../include/asm-xen/asm-i386/pgtable.h | 8 ++++---- .../include/asm-xen/asm-x86_64/pgtable.h | 14 ++++++-------- 6 files changed, 29 insertions(+), 28 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/xen/i386/mm/ioremap.c b/linux-2.6-xen-sparse/arch/xen/i386/mm/ioremap.c index 8e14408d54..8016210ece 100644 --- a/linux-2.6-xen-sparse/arch/xen/i386/mm/ioremap.c +++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/ioremap.c @@ -22,13 +22,14 @@ #define ISA_START_ADDRESS 0x0 #define ISA_END_ADDRESS 0x100000 +#if 0 /* not PAE safe */ /* These hacky macros avoid phys->machine translations. */ #define __direct_pte(x) ((pte_t) { (x) } ) #define __direct_mk_pte(page_nr,pgprot) \ __direct_pte(((page_nr) << PAGE_SHIFT) | pgprot_val(pgprot)) #define direct_mk_pte_phys(physpage, pgprot) \ __direct_mk_pte((physpage) >> PAGE_SHIFT, pgprot) - +#endif static int direct_remap_area_pte_fn(pte_t *pte, struct page *pte_page, @@ -37,16 +38,16 @@ static int direct_remap_area_pte_fn(pte_t *pte, { mmu_update_t **v = (mmu_update_t **)data; - (*v)->ptr = ((maddr_t)pfn_to_mfn(page_to_pfn(pte_page)) << + (*v)->ptr = ((u64)pfn_to_mfn(page_to_pfn(pte_page)) << PAGE_SHIFT) | ((unsigned long)pte & ~PAGE_MASK); (*v)++; return 0; } -int direct_remap_area_pages(struct mm_struct *mm, +int direct_remap_pfn_range(struct mm_struct *mm, unsigned long address, - unsigned long machine_addr, + unsigned long mfn, unsigned long size, pgprot_t prot, domid_t domid) @@ -77,9 +78,9 @@ int direct_remap_area_pages(struct mm_struct *mm, * Fill in the machine address: PTE ptr is done later by * __direct_remap_area_pages(). */ - v->val = pte_val_ma(pfn_pte_ma(machine_addr >> PAGE_SHIFT, prot)); + v->val = pte_val_ma(pfn_pte_ma(mfn, prot)); - machine_addr += PAGE_SIZE; + mfn++; address += PAGE_SIZE; v++; } @@ -97,8 +98,10 @@ int direct_remap_area_pages(struct mm_struct *mm, return 0; } -EXPORT_SYMBOL(direct_remap_area_pages); +EXPORT_SYMBOL(direct_remap_pfn_range); + +/* FIXME: This is horribly broken on PAE */ static int lookup_pte_fn( pte_t *pte, struct page *pte_page, unsigned long addr, void *data) { @@ -218,7 +221,7 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l #ifdef __x86_64__ flags |= _PAGE_USER; #endif - if (direct_remap_area_pages(&init_mm, (unsigned long) addr, phys_addr, + if (direct_remap_pfn_range(&init_mm, (unsigned long) addr, phys_addr>>PAGE_SHIFT, size, __pgprot(flags), domid)) { vunmap((void __force *) addr); return NULL; diff --git a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c index c1694fe7bb..8b42041e62 100644 --- a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c +++ b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c @@ -154,12 +154,12 @@ static int map_frontend_pages(netif_t *netif, unsigned long localaddr, pgprot_t prot = __pgprot(_KERNPG_TABLE); int err; - err = direct_remap_area_pages(&init_mm, localaddr, - tx_ring_ref<domid); - err |= direct_remap_area_pages(&init_mm, localaddr + PAGE_SIZE, - rx_ring_ref<domid); if (err) diff --git a/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c b/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c index ed068a06c6..a2965a0e70 100644 --- a/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c +++ b/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c @@ -116,9 +116,9 @@ static int privcmd_ioctl(struct inode *inode, struct file *file, if ( (msg[j].va + (msg[j].npages< vma->vm_end ) return -EINVAL; - if ( (rc = direct_remap_area_pages(vma->vm_mm, + if ( (rc = direct_remap_pfn_range(vma->vm_mm, msg[j].va&PAGE_MASK, - msg[j].mfn<vm_page_prot, mmapcmd.dom)) < 0 ) diff --git a/linux-2.6-xen-sparse/drivers/xen/usbback/interface.c b/linux-2.6-xen-sparse/drivers/xen/usbback/interface.c index 27365b3fa6..ab44ed3040 100644 --- a/linux-2.6-xen-sparse/drivers/xen/usbback/interface.c +++ b/linux-2.6-xen-sparse/drivers/xen/usbback/interface.c @@ -161,8 +161,8 @@ void usbif_connect(usbif_be_connect_t *connect) } prot = __pgprot(_KERNPG_TABLE); - error = direct_remap_area_pages(&init_mm, VMALLOC_VMADDR(vma->addr), - shmem_frame<addr), + shmem_frame, PAGE_SIZE, prot, domid); if ( error != 0 ) { diff --git a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h index 6e33a59886..4779997177 100644 --- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h @@ -460,9 +460,9 @@ void make_pages_writable(void *va, unsigned int nr); #define kern_addr_valid(addr) (1) #endif /* !CONFIG_DISCONTIGMEM */ -int direct_remap_area_pages(struct mm_struct *mm, +int direct_remap_pfn_range(struct mm_struct *mm, unsigned long address, - unsigned long machine_addr, + unsigned long mfn, unsigned long size, pgprot_t prot, domid_t domid); @@ -474,10 +474,10 @@ int touch_pte_range(struct mm_struct *mm, unsigned long size); #define io_remap_page_range(vma,from,phys,size,prot) \ -direct_remap_area_pages(vma->vm_mm,from,phys,size,prot,DOMID_IO) +direct_remap_pfn_range(vma->vm_mm,from,phys>>PAGE_SHIFT,size,prot,DOMID_IO) #define io_remap_pfn_range(vma,from,pfn,size,prot) \ -direct_remap_area_pages(vma->vm_mm,from,pfn<vm_mm,from,pfn,size,prot,DOMID_IO) #define MK_IOSPACE_PFN(space, pfn) (pfn) #define GET_IOSPACE(pfn) 0 diff --git a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h index e8f986c452..86f1b4f7fa 100644 --- a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h @@ -526,28 +526,26 @@ extern int kern_addr_valid(unsigned long addr); #define DOMID_LOCAL (0xFFFFU) -int direct_remap_area_pages(struct mm_struct *mm, +int direct_remap_pfn_range(struct mm_struct *mm, unsigned long address, - unsigned long machine_addr, + unsigned long mfn, unsigned long size, pgprot_t prot, domid_t domid); -int __direct_remap_area_pages(struct mm_struct *mm, - unsigned long address, - unsigned long size, - mmu_update_t *v); + int create_lookup_pte_addr(struct mm_struct *mm, unsigned long address, unsigned long *ptep); + int touch_pte_range(struct mm_struct *mm, unsigned long address, unsigned long size); #define io_remap_page_range(vma, vaddr, paddr, size, prot) \ - direct_remap_area_pages((vma)->vm_mm,vaddr,paddr,size,prot,DOMID_IO) + direct_remap_pfn_range((vma)->vm_mm,vaddr,paddr>>PAGE_SHIFT,size,prot,DOMID_IO) #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ - direct_remap_area_pages((vma)->vm_mm,vaddr,(pfn)<vm_mm,vaddr,pfn,size,prot,DOMID_IO) #define MK_IOSPACE_PFN(space, pfn) (pfn) #define GET_IOSPACE(pfn) 0 -- 2.30.2